#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define TYPE int

typedef struct Queue
{
	TYPE* arr;
	int size;	// 容量
	int head;	// 队头
	int tail;	// 队尾
	int cnt;    // 数量
}Queue;

// 创建
Queue* create_queue(int len);
// 销毁
void destory_queue(Queue* queue);
// 队空
bool empty_queue(Queue* queue);
// 队满
bool full_queue(Queue* queue);
// 入队
bool push_queue(Queue* queue,TYPE data);
// 出队
bool pop_queue(Queue* queue);
// 队头
TYPE* head_queue(Queue* queue);
// 队尾
TYPE* tail_queue(Queue* queue);
// 遍历
void show_queue(Queue* queue);


int main()
{
	Queue* queue = create_queue(13);
	for(int i=0; i<15; i++)
	{
		push_queue(queue,i);
		printf("head:%d ",*head_queue(queue));
		printf("tail:%d ",*tail_queue(queue));
		printf("cnt:%d\n",queue->cnt);
	}
	show_queue(queue);
	for(int i=0; i<10; i++)
	{
		pop_queue(queue);
	}
	show_queue(queue);
	printf("head:%d ",*head_queue(queue));
	printf("tail:%d\n",*tail_queue(queue));
}

// 创建
Queue* create_queue(int len)
{
	Queue* queue = malloc(sizeof(Queue));
	queue->arr = malloc(sizeof(TYPE)*len);
	queue->size = len;
	queue->head = 0;
	queue->tail = -1;
	queue->cnt = 0;
	return queue;
}
// 销毁
void destory_queue(Queue* queue)
{
	free(queue->arr);
	free(queue);
}
// 队空
bool empty_queue(Queue* queue)
{
	return !queue->cnt;
}
// 队满
bool full_queue(Queue* queue)
{
	return queue->cnt >= queue->size;
}
// 入队
bool push_queue(Queue* queue,TYPE data)
{
	// 判断是否队满
	if(full_queue(queue)) return false;
	queue->tail = (queue->tail+1) % queue->size; 
	queue->arr[queue->tail] = data;
	//printf("push...\n");
	queue->cnt++;
	return true;
}
// 出队
bool pop_queue(Queue* queue)
{
	// 判断是否队空
	if(empty_queue(queue)) return false;
	queue->head = (queue->head+1) % queue->size;
	queue->cnt--;
	return true;
}
// 队头
TYPE* head_queue(Queue* queue)
{
	if(empty_queue(queue)) return NULL;
	return queue->arr + queue->head;
}
// 队尾
TYPE* tail_queue(Queue* queue)
{
	if(empty_queue(queue)) return NULL;
	return queue->arr + queue->tail;
}

void show_queue(Queue* queue)
{
	for(int i=queue->head; i<queue->tail; i++)
	{
		printf("%d ",queue->arr[i]);
	}
	printf("\n");
}
